package 行为型模式.解释器模式;

/**
 * 解释器模式包含以下主要角色：
 * 抽象表达式(AbstractExpression): 声明一个抽象的解释操作，这个接口为所有具体表达式所共享。
 * 终结符表达式(TerminalExpression): 实现与文法中的终结符相关的解释操作。
 * 非终结符表达式(NonterminalExpression): 为文法中的非终结符实现解释操作，通常包含对其他表达式的引用。
 * 上下文(Context): 包含解释器之外的一些全局信息。
 * 客户端(Client): 构建(或被给定)表示该文法定义的语言中一个特定句子的抽象语法树，该抽象语法树由TerminalExpression和NonterminalExpression的实例装配而成。然后调用解释操作。
 */

interface Expression
{
	Double interpret();
}

class Number implements Expression
{
	private Double num;

	Number(Double num) {
		this.num = num;
	}

	@Override
	public Double interpret() {
		return num;
	}
}

class Pion implements Expression
{
	@Override
	public Double interpret() {
		return 3.14d;
	}
}

class Add implements Expression
{
	private Expression left;
	private Expression right;

	Add(Expression left, Expression right) {
		this.left = left;
		this.right = right;
	}

	@Override
	public Double interpret() {
		return left.interpret()+right.interpret();
	}
}

class Subtraction implements Expression
{
	private Expression left;
	private Expression right;

	Subtraction(Expression left, Expression right) {
		this.left = left;
		this.right = right;
	}

	@Override
	public Double interpret() {
		return left.interpret()-right.interpret();
	}
}

public class Interpreter 
{
	public static void main(String[] args) 
	{
		Add add = new Add(new Pion(), new Subtraction(new Number(10d), new Number(3d)));
		System.out.println("10-3+3.14="+add.interpret());
	}
}
